import { history } from '@/router'
import store from '@/store'
import { ApiResponse } from '@/types/data'
import { RootAction } from '@/types/store'
import { Toast } from 'antd-mobile'
import axios, { AxiosError } from 'axios'
import { getToken, removeToken, setToken } from './token'

const baseURL = 'http://geek.itheima.net/v1_0/'
// const baseURL = 'http://toutiao.itheima.net/v1_0/'
//创建实例
const http = axios.create({
  baseURL: baseURL,
  timeout: 1000 * 5,
})

// 添加请求拦截器
http.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么

    // 统一添加token
    const tokenObj = getToken() //  可能获得的是空对象
    if (tokenObj.token) {
      config.headers!.Authorization = 'Bearer ' + tokenObj.token // 可选链操作符不能进行复制
    }

    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
http.interceptors.response.use(
  (response) => {
    // 对响应数据做点什么
    return response
  },
  async (error: AxiosError<ApiResponse>) => {
    // 对响应错误做点什么, 一旦响应失败就出现错误提示
    if (!error.response) {
      // 服务器崩了, 网络崩了
      Toast.show('服务器繁忙, 请稍后再试')

      return Promise.reject(error)
    }

    // ----------token无感刷新-------------
    console.log('error', error.response)
    if (error.response.status === 401) {
      //token 有问题
      const tokenObj = getToken()
      if (tokenObj.token) {
        try {
          // token过期了
          // 刷新token是需要refresh_token去发请求的!!! 必须使用原生axios
          const res = await axios.put<ApiResponse<{ token: string }>>(
            baseURL + 'authorizations',
            null,
            {
              headers: {
                Authorization: 'Bearer ' + tokenObj.refresh_token,
              },
            }
          )

          console.log('新token', res.data.data.token)
          // 新的主token ===>>> 组装成tokenObj
          const newTokenObj = {
            token: res.data.data.token,
            refresh_token: tokenObj.refresh_token,
          }

          // 存入仓库, 本地
          setToken(newTokenObj)
          store.dispatch({
            type: 'login/login',
            payload: newTokenObj,
          } as RootAction)

          // 原来报错的请求没有处理, 失败的请求重新发 => 无感
          // http({
          //   method: 'get',
          //   url: '/user',
          // })
          // error.config => 这里就有之前出的请求的所有配置
          return http(error.config)
        } catch (e) {
          // 表示refresh_token也过期了, 清除本地, store中的token和refresh_token
          removeToken()
          store.dispatch({
            type: 'login/login',
            payload: {},
          } as RootAction)

          //回到登录页
          history.push({
            pathname: '/login',
            state: {
              from: history.location.pathname,
            },
          })
        }
      } else {
        // 未登录
        // history.push('/login')
        history.push({
          pathname: '/login',
          state: {
            from: history.location.pathname, // 回调地址
          },
        })
      }
    }
    // ----------token无感刷新-------------

    // 直接获取后端给的文字, 做提示
    // Toast.show(error.response.data.message)
    Toast.show(
      error.response.data.message === 'token超时或者未传token'
        ? '登录已失效,重新登录'
        : error.response.data.message
    )
    // Toast.show({
    //   content: error.response.data.message,
    //   icon: 'fail',
    //   duration: 1000,
    // })

    return Promise.reject(error)
  }
)

export default http
